package com.baseframe.sys.service.impl;

import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baseframe.common.utils.PageUtils;
import com.baseframe.common.utils.R;
import com.baseframe.sys.entity.FrameConfig;
import com.baseframe.sys.redis.FrameConfigRedis;
import com.baseframe.sys.service.IFrameConfigService;
import com.baseframe.sys.service.dao.FrameConfigRepository;

@Service("frameConfigService")
public class FrameConfigServiceImpl implements IFrameConfigService {
	@Autowired
	private FrameConfigRedis frameConfigRedis;
	@PersistenceContext
	private EntityManager em;
	@Autowired
	private FrameConfigRepository frameConfigRepository;

	@Override
	public PageUtils queryPage(Map<String, Object> params) {
		String configname = (String) params.get("configname");
		int pageSize = Integer.parseInt((String)params.get("limit"));
		int page = Integer.parseInt((String)params.get("page"));
		//TODO
		String sidx = (String)params.get("sidx");//??
		String order = (String)params.get("order");

		String chql = "select count(1) ";
		String hql = "from FrameConfig t  where 1=1";
		if (configname != null && !configname.trim().equals("")) {
			hql += " and t.configname like '%" + configname + "%'";
		}
		chql = chql + hql;
		if(sidx!=null&&!sidx.equals("")){
			hql+=" order by t."+sidx+" "+order;
		}

		int total = Integer.parseInt(em.createQuery(chql).getSingleResult().toString());

		@SuppressWarnings("unchecked")
		List<FrameConfig> configlist = em.createQuery(hql).setFirstResult((page - 1) * pageSize)
				.setMaxResults(page * pageSize).getResultList();

		PageUtils pageutil = new PageUtils(configlist, total, pageSize, page);

		return pageutil;
	}

	@Override
	public void save(FrameConfig config) {
		frameConfigRepository.save(config);
		frameConfigRedis.saveOrUpdate(config);

	}

	@Override
	public void update(FrameConfig config) {
		frameConfigRepository.save(config);
		frameConfigRedis.saveOrUpdate(config);

	}
	
	@Override
	public FrameConfig selectByConfigName(String configname) {
		//先从redis中获取
		FrameConfig config=frameConfigRedis.get(configname);
		 if(config == null){
			 config = frameConfigRepository.findCountByConfigname(configname);
			 if(config != null){
				 frameConfigRedis.saveOrUpdate(config);
			 }
		 }
		return config;
	}

	@Override
	public int deleteBatchNames(List<String> confignames) {
		 try {
			 confignames.forEach(configname -> {
				 FrameConfig config=this.selectByConfigName(configname);
				 frameConfigRepository.delete(config);
				 frameConfigRedis.delete(configname);
	            });
	            return 0;
	        } catch (Exception e) {
	            e.printStackTrace();
	            return 1;
	        }
	}



	

	// @Override
	// public PageUtils queryPage(Map<String, Object> params) {
	// String key = (String)params.get("key");
	//
	// Page<SysConfigEntity> page = this.selectPage(
	// new Query<SysConfigEntity>(params).getPage(),
	// new EntityWrapper<SysConfigEntity>()
	// .like(StringUtils.isNotBlank(key),"key", key)
	// .eq("status", 1)
	// );
	//
	// return new PageUtils(page);
	// }
	//
	// @Override
	// public void save(SysConfigEntity config) {
	// this.insert(config);
	// sysConfigRedis.saveOrUpdate(config);
	// }
	//
	// @Override
	// @Transactional(rollbackFor = Exception.class)
	// public void update(SysConfigEntity config) {
	// this.updateById(config);
	// sysConfigRedis.saveOrUpdate(config);
	// }
	//
	// @Override
	// @Transactional(rollbackFor = Exception.class)
	// public void updateValueByKey(String key, String value) {
	// baseMapper.updateValueByKey(key, value);
	// sysConfigRedis.delete(key);
	// }
	//
	// @Override
	// @Transactional(rollbackFor = Exception.class)
	// public void deleteBatch(Long[] ids) {
	// for(Long id : ids){
	// SysConfigEntity config = this.selectById(id);
	// sysConfigRedis.delete(config.getKey());
	// }
	//
	// this.deleteBatchIds(Arrays.asList(ids));
	// }
	//
	// @Override
	// public String getValue(String key) {
	// SysConfigEntity config = sysConfigRedis.get(key);
	// if(config == null){
	// config = baseMapper.queryByKey(key);
	// sysConfigRedis.saveOrUpdate(config);
	// }
	//
	// return config == null ? null : config.getValue();
	// }
	//
	// @Override
	// public <T> T getConfigObject(String key, Class<T> clazz) {
	// String value = getValue(key);
	// if(StringUtils.isNotBlank(value)){
	// return new Gson().fromJson(value, clazz);
	// }
	//
	// try {
	// return clazz.newInstance();
	// } catch (Exception e) {
	// throw new RRException("获取参数失败");
	// }
	// }
}
